/**数字处理相关的集合
*
*/
let GNum = new class {
    /**随机一个范围 min~max 的整数      
     * @param min 范围的最小值，或者一个2元素的数组  
     * @param max 范围的最大值，或者为空  
     * @example
     * GNum.randomInt(1, 10);
     * GNum.randomInt([1, 10]);
     */
    randomInt(min: number | number[], max?: number) {
        if (Array.isArray(min) && typeof max == "undefined") {
            max = min[1];
            min = min[0];
        }
        return Math.floor(Math.random() * (max - <number>min + 1)) + <number>min;
    }

    /**随机一个范围 min~max 的小数      
     * @param min 范围的最小值，或者一个2元素的数组  
     * @param max 范围的最大值，或者为空  
     * @example
     * GNum.randomInt(1, 8);
     * GNum.randomInt([2.3, 12.3]);
     */
    random(min: number | number[], max?: number) {
        if (Array.isArray(min) && typeof max == "undefined") {
            max = min[1];
            min = min[0];
        }
        let ratio = Math.random();
        return <number>min + (max - <number>min) * ratio;
    }

    /**随机一个 -1 ~ 1 的小数  
     * @example
     * GNum.random_1To1();
     */
    random_1To1() {
        return this.random([-1, 1]);
    }

    /**将时间（单位：秒）格式化成 min:sencond 的形式显示  
     * @param time 时间的秒数  
     * @example
     * GNum.timeFormatToMin(179); // "02:59"
     */
    timeFormatToMin(time: number) {
        //四舍五入取整
        time = Math.round(time);
        let min: number | string = Math.floor(time / 60);
        let sencond: number | string = time % 60;
        if (min < 10) {
            min = "0" + min;
        }
        if (sencond < 10) {
            sencond = "0" + sencond;
        }
        return min + ":" + sencond;
    }

    /**将时间（单位：秒）格式化成 hour:min:sencond 的形式显示  
     * @param time 时间的秒数  
     * @example
     * GNum.timeFormatToMin(3601); // "01:00:01"
     */
    timeFormatToHour(time: number) {
        //四舍五入取整
        time = Math.round(time);
        let hour: number | string = Math.floor(time / 3600);
        if (hour < 10) {
            hour = "0" + hour;
        }
        let min = this.timeFormatToMin(time % 3600);
        return hour + ":" + min;
    }

    /**限制一个数的范围，返回限制后的结果  
     * @param num 要限制的数字  
     * @param range 一个2个数字的数字，表示数字限制的范围   
     * @example
     * GNum.clamp(16, [20, 30]); // 20
     * GNum.clamp(16, [1, 10]); // 10
     * GNum.clamp(16, [20, Infinity]); // 20    
     */
    clamp(num: number, range: number[]) {
        let [min, max] = range;
        num = num < min ? min : num;
        num = num > max ? max : num;
        return num;
    }

    

}();
window["GNum"] = GNum;